import SparkMD5 from 'spark-md5/spark-md5.min'

// worker 内部有一个监听函数，监听 message事件

// 在 worker线程中 接受文件切片 fileChunkList 利用 fileReader 读取每个切片的 ArrayBuffer 并不断传入 spark-md5 中，计算完
// 每一个切片通过 postMessage 向主线程发送一个进度事件，全部完成后将最终的hash 发送给主线程

//spark-md5 需要根据所有切片才能算出一个 hash 值，不能直接将整个文件放入计算，否则即使不同文件也会有相同的 hash

self.onmessage = e => {
  const { fileChunkList } = e.data
  let percentage = 0
  let count = 0
  const spark = new SparkMD5()

  // console.dir(spark.append)
  const loadNext = index => {
    const reader = new FileReader()
    reader.readAsArrayBuffer(fileChunkList[index].file)

    reader.onload = e => {
      count++
      spark.append(e.target.result)
      if (count === fileChunkList.length) {
        self.postMessage({
          percentage: 100,
          hash: spark.end()
        })
        self.close()
      } else {
        percentage += 100 / fileChunkList.length
        self.postMessage({
          percentage
        })

        loadNext(count)
      }
    }
  }
  loadNext(0)
}